let centerX, centerY;
let snowflakes = []; // 用于存储雪花的数组
let snowground; // 雪地

function setup() {
    createCanvas(500, 600);
    noStroke();

    centerX = width / 2;
    centerY = height / 2 + 140;

    // 创建雪地对象
    snowground = new Snowground();
}

function draw() {
    background(100); // 设置背景为黑色

    push()
        Tree()
        Star(centerX, centerY - 50, 5, 10, 5)
    pop()

    push()
        snowground.Display();
        snowground.Snow();
    pop()
}

function Tree() {
    fill("#847150")
    rect(centerX - 10, centerY + 65, 20, 50)

    fill("#16a085")
    noStroke()

    triangle(centerX - 30, centerY, centerX + 30, centerY, centerX + 0, centerY - 50)
    triangle(centerX - 40, centerY + 25, centerX + 40, centerY + 25, centerX + 0, centerY - 20)
    triangle(centerX - 50, centerY + 55, centerX + 50, centerY + 55, centerX + 0, centerY - 10)
    triangle(centerX - 60, centerY + 90, centerX + 60, centerY + 90, centerX + 0, centerY + 20)

}

// 绘制星星的函数
function Star(x, y, radius1, radius2, npoints) {
    drawingContext.shadowColor = color("#f1c40f");
    drawingContext.shadowBlur = 10;
    stroke("#f1c40f")

    fill("#f1c40f")
    let angle = TWO_PI / npoints;
    let halfAngle = angle / 2.0;
    beginShape();
    for (let a = -PI / 2; a < TWO_PI - PI / 2; a += angle) {
        let sx = x + cos(a) * radius2;
        let sy = y + sin(a) * radius2;
        vertex(sx, sy);
        sx = x + cos(a + halfAngle) * radius1;
        sy = y + sin(a + halfAngle) * radius1;
        vertex(sx, sy);
    }
    endShape(CLOSE);
    strokeWeight(2)

    drawingContext.shadowColor = color("#ecf0f1");
    stroke("#ecf0f1")
    fill("#ecf0f1")
    line(x - 21, y + 44, x + 13, y + 25)
    line(x - 25, y + 44 + 25, x + 16, y + 22 + 25)
    line(x - 30, y + 44 + 55, x + 22, y + 25 + 52)
    line(x - 35, y + 44 + 85, x + 25, y + 25 + 82)

    stroke("#f1c40f")
    fill("#f1c40f")
    drawingContext.shadowColor = color("#f1c40f");
    ellipse(x + 3, y + 35, 7, 7)
    ellipse(x - 12, y + 66, 7, 7)
    ellipse(x + 10, y + 68 + 17, 7, 7)
    ellipse(x - 12, y + 68 + 56, 7, 7)

    // 正方形
    fill("#e74c3c")
    stroke("#e74c3c")
    drawingContext.shadowBlur = 30;
    // noStroke()
    drawingContext.shadowColor = color("#e74c3c");
    ellipse(x + 10, y + 55, 10, 10)
    ellipse(x - 15, y + 68 + 30, 10, 10)
    ellipse(x + 16, y + 58 + 58, 10, 10)
}


function snow() {
    // 每帧生成一个新的雪花
    let t = frameCount / 60; // 使用帧数来控制雪花的速度
    snowflakes.push(new Snowflake()); // 创建新的雪花对象并添加到数组中

    // 遍历雪花数组，更新和绘制每个雪花
    for (let flake of snowflakes) {
        flake.update(t); // 更新雪花的位置
        flake.display(); // 绘制雪花

        // 如果雪花落到雪地上，则停止下落
        if (flake.y > snowground.y) {
            flake.y = snowground.y;
            flake.speed = 0;
        }
    }

    // 移除超出画布的雪花，以避免数组过大
    for (let i = snowflakes.length - 1; i >= 0; i--) {
        if (snowflakes[i].y > height) {
            snowflakes.splice(i, 1);
        }
    }
}

// 定义雪花对象
class Snowflake {
    constructor() {
        this.x = random(width + 200) - 100; // 随机横坐标
        this.y = random(-10, -100); // 随机纵坐标，初始位置在屏幕上方
        this.size = random(2, 10); // 随机大小
        this.speed = random(1, 10); // 随机下落速度
        this.angle = random(TWO_PI + 10); // 随机初始角度
        this.angleIncrement = random(0.01, 0.1); // 随机角度增量
        this.isOnGround = false; // 是否在地上的标志
    }

    // 更新雪花的位置
    update(t) {
        // 如果雪花已经在地上，不再更新位置
        if (this.isOnGround) {
            return;
        }

        // 雪花的漂浮效果，可根据需要调整公式
        this.y += pow(this.speed, 0.5) + 0.1;

        // 雪花的左右摆动效果，可根据需要调整公式
        this.x += sin(t * 0.5) * 2;

        // 随机增加角度，增加下落方向的随机性
        this.angle += this.angleIncrement;

        // 添加一些随机的漂移效果
        this.x += cos(this.angle) * 0.5;

        // 如果雪花落到雪地上，则停止下落
        if (this.y > snowground.y) {
            this.y = snowground.y;
            this.speed = 0;
            this.isOnGround = true; // 设置在地上的标志为true
        }
    }

    // 绘制雪花
    display() {
        fill(255); // 设置填充色为白色
        ellipse(this.x, this.y, this.size, this.size); // 绘制圆形雪花
    }
}

// 定义雪地对象
class Snowground {
    constructor() {
        this.y = height - 50; // 雪地的纵坐标
    }

    // 绘制雪地
    Display() {
        fill(255); // 设置填充色为白色
        rect(0, this.y, width, height - this.y); // 绘制雪地矩形
    }

    Snow(){
        snow()
    }
}
